/*
 * This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
 *
 * (c) Matthias L. Jugel, Marcus Meißner 1996-2005. All Rights Reserved.
 *
 * Please visit http://javatelnet.org/ for updates and contact.
 *
 * --LICENSE NOTICE--
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 * --LICENSE NOTICE--
 *
 */

package de.mud.jta.plugin;

import de.mud.jta.Plugin;
import de.mud.jta.PluginBus;
import de.mud.jta.PluginConfig;
import de.mud.jta.ResourceManager;
import de.mud.jta.VisualPlugin;
import de.mud.jta.event.ConfigurationListener;
import de.mud.jta.event.OnlineStatusListener;
import de.mud.jta.event.SocketListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JComponent;
import javax.swing.JMenu;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Hashtable;

/**
 * A simple plugin showing the current status of the application whether it is
 * online or not.
 * <P>
 * <B>Maintainer:</B> Matthias L. Jugel
 * 
 * @version $Id: Status.java 499 2005-09-29 08:24:54Z leo $
 * @author Matthias L. Jugel, Marcus Mei�ner
 */
public class Status extends Plugin implements VisualPlugin, Runnable
{
    private ResourceManager rm = ResourceManager.getInstance();
    
    private final static int debug = 0;

    private JLabel status;
    private JLabel host;
    private JPanel sPanel;

    private String address, port;

    private String infoURL;
    private int interval;
    private Thread infoThread;

    private Hashtable ports = new Hashtable();

    public Status(PluginBus bus, final String id)
    {
	super(bus, id);

	// setup the info
	bus.registerPluginListener(new ConfigurationListener()
	{
	    public void setConfiguration(PluginConfig config)
	    {
		infoURL = config.getProperty("Status", id, "info");
		if (infoURL != null)
		    host.setAlignmentX(JLabel.CENTER);
		String tmp;
		if ((tmp = config.getProperty("Status", id, "font")) != null)
		{
		    String font = tmp;
		    int style = Font.PLAIN, fsize = 12;
		    if ((tmp = config.getProperty("Status", id, "fontSize")) != null)
			fsize = Integer.parseInt(tmp);
		    String fontStyle = config.getProperty("Status", id,
			    "fontStyle");
		    if (fontStyle == null || fontStyle.equals("plain"))
			style = Font.PLAIN;
		    else if (fontStyle.equals("bold"))
			style = Font.BOLD;
		    else if (fontStyle.equals("italic"))
			style = Font.ITALIC;
		    else if (fontStyle.equals("bold+italic"))
			style = Font.BOLD | Font.ITALIC;
		    host.setFont(new Font(font, style, fsize));
		}

		if ((tmp = config.getProperty("Status", id, "foreground")) != null)
		    host.setForeground(Color.decode(tmp));

		if ((tmp = config.getProperty("Status", id, "background")) != null)
		    host.setBackground(Color.decode(tmp));

		if (config.getProperty("Status", id, "interval") != null)
		{
		    try
		    {
			interval = Integer.parseInt(config.getProperty(
				"Status", id, "interval"));
			infoThread = new Thread(Status.this);
			infoThread.start();
		    }
		    catch (NumberFormatException e)
		    {
			Status.this.error("interval is not a number");
		    }
		}
	    }
	});

	// fill port hashtable
	ports.put("22", "ssh");
	ports.put("23", "telnet");
	ports.put("25", "smtp");

	sPanel = new JPanel(new BorderLayout());

	host = new JLabel(rm.getString("jta.message.notconnected"), JLabel.LEFT);

	bus.registerPluginListener(new SocketListener()
	{
	    public void connect(String addr, int p)
	    {
		address = addr;
		if (address == null || address.length() == 0)
		    address = "<unknown host>";
		if (ports.get("" + p) != null)
		    port = (String) ports.get("" + p);
		else
		    port = "" + p;
		if (infoURL == null)
		    host.setText(rm.getString("jta.message.trying")+ address + " " + port + " ...");
	    }

	    public void disconnect()
	    {
		if (infoURL == null)
		    host.setText(rm.getString("jta.message.notconnected"));
	    }
	});

	sPanel.add("Center", host);

	status = new JLabel("offline", JLabel.CENTER);

	bus.registerPluginListener(new OnlineStatusListener()
	{
	    public void online()
	    {
		status.setText("online");
		status.setForeground(Color.green);
		if (infoURL == null)
		    host.setText(rm.getString("jta.message.connectedTo") + address + " " + port);
		status.repaint();
	    }

	    public void offline()
	    {

		status.setText(rm.getString("jta.message.offline"));
		status.setForeground(Color.red);
		if (infoURL == null)
		    host.setText(rm.getString("jta.message.notconnected"));
		status.repaint();
	    }
	});

	sPanel.add("East", status);

    }

    public void run()
    {
	URL url = null;
	try
	{
	    url = new URL(infoURL);
	}
	catch (Exception e)
	{
	    error("infoURL is not valid: " + e);
	    infoURL = null;
	    return;
	}

	while (url != null && infoThread != null)
	{
	    try
	    {
		BufferedReader content = new BufferedReader(
			new InputStreamReader(url.openStream()));
		try
		{
		    String line;
		    while ((line = content.readLine()) != null)
		    {
			if (line.startsWith("#"))
			{
			    String color = line.substring(1, 7);
			    line = line.substring(8);
			    host.setForeground(Color.decode("#" + color));
			}
			host.setText(line);
			infoThread.sleep(10 * interval);
		    }
		}
		catch (IOException e)
		{
		    error("error while loading info ...");
		}
		infoThread.sleep(100 * interval);
	    }
	    catch (Exception e)
	    {
		error("error retrieving info content: " + e);
		e.printStackTrace();
		host.setForeground(Color.red);
		host.setText(rm.getString("jta.message.error.retrieve.content"));
		infoURL = null;
		return;
	    }
	}
    }

    public JComponent getPluginVisual()
    {
	return sPanel;
    }

    public JMenu getPluginMenu()
    {
	return null;
    }
}
